package com.sxj.corejava.code07_面向对象.多态;

/**
 * @author 石小俊
 * @date 2024年03月21日 18:03
 */
public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show() {
        System.out.println("这是父类的方法");
    }
}

class Man extends Person {
    private double salary;

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void show() {
        System.out.println("这是Man中的方法");
    }

    public void work() {
        System.out.println("作为一个男人,需要赚钱养家,我每个月能赚" + salary + "元");
    }
}

class WoMan extends Person {
    private int appearance;

    public int getAppearance() {
        return appearance;
    }

    public void setAppearance(int appearance) {
        this.appearance = appearance;
    }

    public void show() {
        System.out.println("这是WoMan中的方法");
    }

    public void shopping() {
        System.out.println("作为一个颜值达到" + appearance + "的女士,只需要负责貌美如花,没事逛逛街购购物!");
    }

}

class Test {
    public static void main(String[] args) {
        // 编译时类型:Person
        // 运行时类型:Man
        // Person是Man的父类
        // 父类的引用指向了子类的对象
        // 此时编译的时候我们看到的类型是Person类型的
        // 从小的类型转换成大的类型称之为向上转型
        // 向上转型时会进行自动类型转换
        Person person = new Man();
        // 此时打印的结果,可以看到是一个Man类型
        // 打印结果表示的是运行时类型
        System.out.println(person);
        // 由于person的本质是一个Man类型
        // 因此,在运行时,执行的是Man中的方法
        person.show();

        // 父类转换成子类时,表示向下转型,需要使用强制类型转换
        // 在进行强制类型转换时,可能会出现ClassCastException异常
        // 表示类型转换异常
        // 为了避免出现该异常,我们在进行强制类型转换时,需要做一个判断
        // 判断是否可以转换
        // 变量名 instanceof 类型:表示判断该变量名所表示的对象是否可以转换为指定类型
        // 返回值是一个boolean类型
        if (person instanceof Man) {
            Man man = (Man) person;
            man.setSalary(8000);
            man.work();
        }
        if (person instanceof WoMan) {
            WoMan woMan = (WoMan) person;
            woMan.setAppearance(95);
            woMan.shopping();
        }
        // 子类的对象 --> 父类的引用 --> 子类的对象
    }
}
